home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / waisgate / HTAtom.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  2KB  |  74 lines

  1. /*            Atoms: Names to numbers            HTAtom.c
  2. **            =======================
  3. **
  4. **    Atoms are names which are given representative pointer values
  5. **    so that they can be stored more efficiently, and comparisons
  6. **    for equality done more efficiently.
  7. **
  8. **    Atoms are kept in a hash table consisting of an array of linked lists.
  9. **
  10. ** Authors:
  11. **    TBL    Tim Berners-Lee, WorldWideWeb project, CERN
  12. **    (c) Copyright CERN 1991 - See Copyright.html
  13. **
  14. */
  15. #define HASH_SIZE    101        /* Tunable */
  16. #include "HTAtom.h"
  17.  
  18. #include <stdio.h>                /* joe@athena, TBL 921019 */
  19. #include "HTUtils.h"
  20.  
  21. PRIVATE HTAtom * hash_table[HASH_SIZE];
  22. PRIVATE BOOL initialised = NO;
  23.  
  24. #ifdef __STDC__
  25. PUBLIC HTAtom * HTAtom_for(const char * string)
  26. #else
  27. PUBLIC HTAtom * HTAtom_for(string)
  28.     char * string;
  29. #endif
  30. {
  31.     int hash;
  32.     CONST char * p;
  33.     HTAtom * a;
  34.     
  35.     /*        First time around, clear hash table
  36.     */
  37.     if (!initialised) {
  38.         int i;
  39.     for (i=0; i<HASH_SIZE; i++)
  40.         hash_table[i] = (HTAtom *) 0;
  41.     initialised = YES;
  42.     }
  43.     
  44.     /*        Generate hash Function
  45.     */
  46.     for(p=string, hash=0; *p; p++) {
  47.         hash = (hash * 3 + *p) % HASH_SIZE;
  48.     }
  49.     
  50.     /*        Search for the string in the list
  51.     */
  52.     for (a=hash_table[hash]; a; a=a->next) {
  53.     if (0==strcmp(a->name, string)) {
  54.             /* if (TRACE) fprintf(stderr,
  55.             "HTAtom: Old atom %p for `%s'\n", a, string); */
  56.         return a;                /* Found: return it */
  57.     }
  58.     }
  59.     
  60.     /*        Generate a new entry
  61.     */
  62.     a = (HTAtom *)malloc(sizeof(*a));
  63.     if (a == NULL) outofmem(__FILE__, "HTAtom_for");
  64.     a->name = (char *)malloc(strlen(string)+1);
  65.     if (a->name == NULL) outofmem(__FILE__, "HTAtom_for");
  66.     strcpy(a->name, string);
  67.     a->next = hash_table[hash];        /* Put onto the head of list */
  68.     hash_table[hash] = a;
  69. /*    if (TRACE) fprintf(stderr, "HTAtom: New atom %p for `%s'\n", a, string); */
  70.     return a;
  71. }
  72.  
  73.  
  74.